// js
let demo = true


/** 集中调用函数 */
class FunArrClass {
	/** 函数数组 */
	FArr = [];
	/** 创建执行 */
	constructor() { }
	/** 要添加的函数
	 * @param {Function} _AddFun 放入的函数
	 * @returns {Number} 返回 调用序号
	 */
	push(_AddFun) {
		let ii = -1;        // 寄存放入位置
		if (this.FArr.length == 0) {        // 如果长度为 0 没有数据
			this.FArr.push(_AddFun);        // 直接放入函数
			return this.FArr.length - 1     // 返回 调用序号
		}
		for (let i = 0; i < this.FArr.length; i++) { // 遍历数组
			if (this.FArr[i] == undefined) {        // 如果哪个空为空
				ii = i;         // 将空的位置放入位置
			}
		}
		if (ii == -1) { // 没有中间空位
			this.FArr.push(_AddFun);        // 最后添加放入函数
			return this.FArr.length - 1     // 返回 调用序号
		} else {        // 中间有空位
			this.FArr[ii] = _AddFun;        // 函数放入空位
			return ii                       // 返回 调用序号
		}
	}
	/** 执行放入的函数
	 * @param {Number} _Num 调用序号
	 * @param  {...any} arg 多个变量
	 * @returns 返回调用后执行的结果
	 */
	fun(_Num, ...arg) {
		if (this.FArr[_Num] == undefined) {
			console.error("[FunArrClass] : 没能成功获取到调用的函数[ " +
				_Num + " ]，可能没有添加或已经删除，请重新确认调用序号。")
			return false
		}
		return this.FArr[_Num](...arg);
	}
	/** 根据调用序号删除某个函数 无返回 删除后该位为空 再次调用提示错误
	 * @param {Number} _Num 删除的调用序号
	 */
	del(_Num) {
		// return this.FArr.splice(_Num, 1)     // 不行，会修改调用序号
		this.FArr[_Num] = undefined;
	}
	/** 显示函数列表 无返回*/ // 后续可以返回对象
	list() {
		if (this.FArr.length == 0) {        // 函数列表没有数据
			console.log(`[FunArrClass] : 函数数据长度 ${this.FArr.length}`)
			return 0;
		}
		this.FArr.map((e, i) => {
			console.log(`${i}\t${e}`)
		})
	}
}

//------------------------------使用例子-------------------------------------
if (demo) {
	let clickArr = new FunArrClass()		// 创建对象
	let 添加按钮 = {			// 按钮传入的函数执行方法
		fun: (...arg) => {
			return clickArr.fun(添加按钮.i, ...arg)
		},
		i: -1,
	}
	console.log(`正常添加及调用函数：`)
	添加按钮.i = clickArr.push(() => { console.log(`测试调用函数`) })// 添加函数0
	let ee = clickArr.push(() => { return 1 })		// 添加函数1 后来会删除
	clickArr.push(() => { return 2 })				// 添加函数2 
	clickArr.list()									// 显示函数列表
	添加按钮.fun()									// 调用打包成json的函数
	console.log(`删除函数：`)
	clickArr.del(ee)			// 删除函数
	clickArr.list()				// 显示函数列表
	console.log(`填入函数：`)
	ee = clickArr.push(() => { console.log(`测试插入函数`) })	// 添加函数 插入中间
	clickArr.list()									// 显示函数列表
	console.log("插入的函数调用序号：" + ee)
	console.log(`参数调用函数：`)
	ee = clickArr.push((...arg) => {				// 添加使用参数函数 
		for (let i = 0; i < arg.length; i++) {
			console.log(arg[i])
		}
	})
	clickArr.fun(ee, "参数1", "参数2")
	console.log(`参数设置的调用函数：`)
	let 按钮 = {											// 参数设置的调用函数
		i: -1,		// 调用序号
		fun: (name, year) => {
			return clickArr.fun(按钮.i, name, year)
		}
	}
	按钮.i = clickArr.push((name, year) => {				// 添加参数设置的调用函数
		console.log("name: " + name)
		console.log("year: " + year)
		return name + " " + year
	})
	let ex = 按钮.fun("张三", 1999)
	console.log("返回信息: " + ex)
}